package app.Cliente;

import geral.pack.Carta;
import java.io.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;

/**
 *
 * @author Pedro
 */
public class Controller {

    private Configurações config;
    private ServerUdp ouvinte, ouvinte2;
    private Cliente user;

    public Controller() throws UnknownHostException {
        config = new Configurações(InetAddress.getLocalHost(), 7071, 7070, InetAddress.getLocalHost(), 8080);
        ouvinte = new ServerUdp(this, 7070);
        new Thread(ouvinte).start();
    }

    public void cadastrar(String nick, String senha, String tipo) {
        //Usa "#" para separar nick e senha.
        byte[] aux = (nick + "#" + senha + "#" + tipo).trim().getBytes();
        Carta msg = new Carta(nick, config.getServerIp().toString(), "cadastro", 0, true, true, aux);
        byte[] aux2 = this.ObjToByte(msg);
        InetAddress adr = null;
       
            adr = config.getServerIp();
        
        //ClientUdp c1 = new ClientUdp(adr, config.getServerPort(), aux2);
        ClientUdp cliente = new ClientUdp(this);
        System.out.println("Ip"+ adr + "porta"+ config.getServerPort());
        System.out.println("Nick" + nick + " senha " + senha);
        cliente.enviar(adr, config.getServerPort(), aux2);
    }

    public void logar(String nick, String senha) throws UnknownHostException {

        byte[] aux = (nick + "#" + senha).getBytes();
        Carta msg = new Carta(nick, config.getServerIp().toString(), "loguin", 0, true, true, aux);
        aux = this.ObjToByte(msg);
        InetAddress adr = null;
     
            adr = config.getServerIp();
      
        user = new Cliente(nick, senha, this.config.getClientePort(), this.config.getClienteIp(), "off", false);
        ClientUdp cliente = new ClientUdp(this);
        cliente.enviar(adr, config.getServerPort(), aux);
        System.out.println("nick" + nick + " senha " + senha);
    }

    public void confirmaLoguin(boolean confirmacao, String tipo) {
        if (confirmacao) {
            user.setStatus(true);
            user.setTipo(tipo);
            ouvinte2 = new ServerUdp(this, 9011);//Responder se Online
            new Thread(ouvinte2).start();
            System.out.println("Logado!");
        } else {
            user.setStatus(false);
        }
    }

    public void estouVivo() throws UnknownHostException {
        InetAddress adr = config.getServerIp();
        Carta msg = new Carta(user.getNick(), "server", "online", 0, true, true, ("alive" + "#" + user.getNick()).getBytes());
        byte[] aux = this.ObjToByte(msg);
        ClientUdp c1 = new ClientUdp(this);
        c1.enviar(adr, config.getServerPort(), aux);
    }

    /*
     * Enviar mensagem de texto. destino = nick do cliente receptor.
     */
    public void sendText(String destino, String texto) throws UnknownHostException {
        byte[] aux = texto.getBytes();
        Carta msg = new Carta(user.getNick(), destino, "texto", 0, true, true, aux);
        Object obj = this.ObjToByte(msg);
        ClientUdp c1 = new ClientUdp(this);
        c1.send(config.getServerIp(), config.getServerPort(), 9505, aux);
    }

    //Converte um Objeto serializavel para um Array de bytes.
    private byte[] ObjToByte(Object obj) {
        byte[] bytes = null;
        if (obj == null) {
            return null;
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(obj);
            oos.flush();
            oos.close();
            bos.close();
            bytes = bos.toByteArray();
        } catch (IOException ex) {
            System.out.println("Erro de Serialização.");
        }
        return bytes;
    }

    //Converte um Objeto serializado para Object.
    
    private Object ByteToObj(byte[] bytes) {
        Object obj = null;
        try {
            ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bis);
            obj = ois.readObject();
        } catch (IOException ex) {
            //TODO: Handle the exception
        } catch (ClassNotFoundException ex) {
            //TODO: Handle the exception
        }
        return obj;
    }
    
    public DefaultListModel addListOn (String [] list){
        
        DefaultListModel listOn = new DefaultListModel();
        int count = Integer.parseInt(list[0]);
        int i;
        for(i=1; i==count;i++){
            listOn.addElement(list[i]);
        }
        
        return listOn;
    }
}